package org.fujay.commons.langchain4j.param;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.FileUtil;
import dev.langchain4j.data.message.*;
import dev.langchain4j.model.chat.ChatModel;
import dev.langchain4j.model.chat.StreamingChatModel;
import dev.langchain4j.model.embedding.EmbeddingModel;
import lombok.Data;
import org.fujay.commons.langchain4j.constant.FileConstant;

import java.io.IOException;
import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;
import java.util.stream.Collectors;

/**
 * 聊天参数类
 * 支持普通对话和RAG检索增强对话
 */
@Data
public class ChatParam {

    /**
     * 用户ID
     */
    private String userId;

    /**
     * 会话ID
     * 用于管理对话历史
     */
    private String memoryId;

    /**
     * 用户消息
     */
    private String userMessage;

    /**
     * 索引名称
     */
    private String indexName;

    /**
     * 系统提示词
     */
    private String systemMessage;

    private ChatModel ChatModel;

    private StreamingChatModel streamingChatModel;

    private EmbeddingModel embeddingModel;

    /**
     * 完成回调
     */
    private Consumer<Message> doOnComplete;

    /**
     * 对话模式
     * 默认为普通对话
     */
    private ChatMode chatMode = ChatMode.NORMAL;

    /**
     * 文档检索最大数量
     */
    private int maxResults = 10;

    /**
     * 混合检索权重
     * 1.0表示完全语义检索，0.0表示完全关键词检索
     */
    private float hybridAlpha = 0.7f;

    /**
     * 文档召回最低分数
     */
    private double minScore = 0.6;

    private int maxMemory;

    /**
     * 元数据过滤条件
     * 可以按文档类型、来源等过滤
     */
    private Map<String, Object> metadataFilters;

    /**
     * 多模态参数 【url地址】
     */
    private List<String> url;

    /**
     * 多模态时重建用户消息
     */
    public UserMessage buildMulti() {

        if (CollUtil.isNotEmpty(url)) {

            List<Content> contents = url.stream()
                    .map(str -> {

                        Content content = null;

                        if (str.startsWith("http") || str.startsWith("https")) {
                            /*文件扩展名*/
                            String extName;

                            try {
                                extName = FileUtil.extName(new URL(str).getFile());
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            }

                            /*图片*/
                            if (Arrays.asList(FileConstant.IMAGE).contains(extName)) {
                                content = ImageContent.from(str);
                            }
                            /*文档*/
                            /*if (Arrays.asList(FileConstant.OFFICE).contains(extName)) {
                                content = TextFileContent.from(str);
                            }*/
                            /*pdf*/
                            if (FileConstant.PDF.equals(extName)) {
                                content = PdfFileContent.from(str);
                            }
                        }

                        return content;
                    })
                    .collect(Collectors.toList());
            contents.add(TextContent.from(userMessage));
            return UserMessage.from(contents);
        }
        return UserMessage.from(userMessage);
    }
}
